package com.zt.chatgpt.weixin.service.message;

import com.google.common.cache.Cache;
import com.zt.chatgpt.types.exception.ChatGPTException;
import com.zt.chatgpt.types.sdk.wexin.util.XmlUtil;
import com.zt.chatgpt.weixin.model.entity.MessageTextEntity;
import com.zt.chatgpt.weixin.model.entity.UserBehaviorMessageEntity;
import com.zt.chatgpt.weixin.model.valobj.MsgTypeVO;
import com.zt.chatgpt.weixin.repository.IWeiXinRepository;
import com.zt.chatgpt.weixin.service.IWeiXinBehaviorService;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @author: zt
 * @Description: 微信受理用户行为接口实现类
 * @create: 2024-05-18 23:41
 */
@Service
public class WeiXinBehaviorService implements IWeiXinBehaviorService {


    @Value("${wx.config.originalid}")
    private String originalId;

    @Resource
    private Cache<String, String> codeCache;

    @Resource
    private IWeiXinRepository repository;

    /**
     * 1. 用户的请求行文，分为事件event、消息text，这里我们只处理消息内容
     * 2. 用户行为、消息类型，是多样性的，这部分如果用户有更多的扩展需求，可以使用设计模式【模板模式 + 策略模式 + 工厂模式】，分拆逻辑。
     */
    @Override
    public String acceptUserBehavior(UserBehaviorMessageEntity userBehaviorMessageEntity) {
        // 1.忽略事件请求
        if (MsgTypeVO.EVENT.getCode().equals(userBehaviorMessageEntity.getMsgType())) {
            return "";
        }

        // 2. 是否是规定的输入码
        if (!userBehaviorMessageEntity.getContent().equals("101")) {
            MessageTextEntity res = MessageTextEntity.builder()
                    .fromUserName(originalId)
                    .toUserName(userBehaviorMessageEntity.getOpenId())
                    .createTime(String.valueOf(System.currentTimeMillis() / 1000L))
                    .msgType(MsgTypeVO.TEXT.getCode())
                    .content(String.format("抱歉, 我不懂你在说什么"))
                    .build();
            return XmlUtil.beanToXml(res);
        }

        // 消息请求
        if (MsgTypeVO.TEXT.getCode().equals(userBehaviorMessageEntity.getMsgType())) {
            // 1. 验证码是否存在
            String code = repository.genCode(userBehaviorMessageEntity.getOpenId());

            // 3. 反馈文本消息-（验证码）
            MessageTextEntity res = MessageTextEntity.builder()
                    .fromUserName(originalId)
                    .toUserName(userBehaviorMessageEntity.getOpenId())
                    .createTime(String.valueOf(System.currentTimeMillis() / 1000L))
                    .msgType(MsgTypeVO.TEXT.getCode())
                    .content(String.format("您的验证码为：%s 有效期 %d 分钟！", code, 3))
                    .build();
            return XmlUtil.beanToXml(res);
        }
        throw new ChatGPTException(userBehaviorMessageEntity.getMsgType() + " 未被处理的行为类型 Err！");
    }
}
